Thema Datum  Von Nutzer Rating
Antwort
14.09.2010 00:06:01 carpetemporem
NotSolved
14.09.2010 18:48:00 Severus
NotSolved
Rot Aw:Membervariablen ByRef ändern?`
16.09.2010 00:20:07 carpetemporem
NotSolved

Ansicht des Beitrags:
Von:
carpetemporem
Datum:
16.09.2010 00:20:07
Views:
431
Rating: Antwort:
  Ja
Thema:
Aw:Membervariablen ByRef ändern?`
Hi Severus,


danke für die Antwort erst Mal.

Natürlich ist mir klar, dass dies mit Memberfunktion geht. Trifft jedoch nicht meinen Anwendungsfall.

Habe Objekte verschiedener Klassen, bei denen in Abhängigkeit des Kontexts verschiedene Membervariablen verschiedener Typen gesetzt werden sollen.

Die Funktion, die den Wert setzt, bekommt nicht das Objekt sondern die zu ändernde Variable übergeben. Dies kann ggf. auch eine lokale oder globale Variable sein.

Zudem kann nicht davon ausgegangen werden, dass für die Membervariablen jeweils eine Memberfunktion zum Setzen implementiert ist. Und falls implementiert, wäre der Name der Memberfunktion und der Typ des Parameters unterschiedlich.

Somit scheidet die Lösung über Memberfunktionen aus.

Habe inzwischen allerdings eine Lösung mittels einer allgemeinen Funktion zum Setzen von Variablen gefunden. Bei Membervariablen arbeitet diese über Let-/Set-Property Aufrufe.

Meine Funktion zum kontextbezogenen Setzen der Variablen bekommt nun als zusätzlichen Parameter den Namen der Membervariablen als String bzw. einen leeren String bei lokalen oder globalen Variablen.

Falls jemand in die Lage kommt, so etwas bzw. eine universelle Funktion zum Setzen von Variablen zu brauchen, hier mal der Sourcecode (leider wahrscheinlich wieder ohne Einrückungen, weil die Forumsoftware ja für gewöhnlich alles rausschmeißt):

Im Klassenmodul der Testklasse 'cTest':
---
Public vTest as Variant
---

Im Modul für meine allgemeinen Funktionen 'gCommon':
---
Public Function mbSet( _
ByRef pvTarget As Variant, ByRef psTarget As Variant, _
ByVal pvSource As Variant) As Boolean
On Error GoTo Error1

If psTarget = "" Then
If IsObject(pvSource) Then
Set pvTarget = pvSource
Else
Let pvTarget = pvSource
End If
Else
If IsObject(pvSource) Then
Call CallByName(pvTarget, psTarget, VbSet, pvSource)
Else
Call CallByName(pvTarget, psTarget, VbLet, pvSource)
End If
End If

Let mbSet = True
Exit Function

Error1:
Let mbSet = False
End Function
---

und zum Test im Modul 'gTest':
---
Public vTest as Variant


Public Sub mTest()
Dim tvTest As Variant
Set tvTest = New cTest

Debug.Print
Call mPrintSet("tvTest", tvTest, "vTest", "member")
Call mPrintSet("tvTest", tvTest, "vTest", New Collection)
Call mPrintSet("tvTest", tvTest, "vTest", Array(0, 1, 2, 3))
Call mPrintSet("tvTest", tvTest, "vTest", 1.23)
Call mPrintSet("tvTest", tvTest, "", "local")
Call mPrintSet("tvTest", tvTest, "", New Collection)
Call mPrintSet("gTest.tvTest", gTest.vTest, "", "global")
Call mPrintSet("gTest.tvTest", gTest.vTest, "", Now())
Debug.Print
End Sub


Public Sub mPrintSet(ByRef psLabel As String, _
ByRef pvTarget As Variant, ByRef psTarget As Variant, _
ByRef pvSource As Variant)
Dim tbSet As Boolean
Let tbSet = gCommon.mbSet(pvTarget, psTarget, pvSource)

Debug.Print "gCommon.mbSet(" _
& psLabel & ", " & Chr(34) & psTarget & Chr(34) & ", " _
& msValue(pvSource) & ") _" & vbCrLf _
& " = " & tbSet

If psTarget = "" Then
Debug.Print psLabel & " = " & msValue(pvTarget)
Else
Debug.Print psLabel & "." & psTarget & " = " _
& msValue(CallByName(pvTarget, psTarget, VbGet))
End If
End Sub


Public Function msValue(ByRef pvVariable As Variant) As String
Let msValue = TypeName(pvVariable)

If IsObject(pvVariable) Then
Exit Function
End If

If IsArray(pvVariable) Then
Let msValue = Left(msValue, Len(msValue) - 2) _
& "(" & LBound(pvVariable)_
& " To " & UBound(pvVariable) & ")"
Exit Function
End If

If VarType(pvVariable) = vbString Then
Let msValue = Chr(34) & pvVariable & Chr(34)
Exit Function
End If

If VarType(pvVariable) = vbDate Then
Let msValue = "#" & pvVariable & "#"
Exit Function
End If

Let msValue = CStr(pvVariable)

If IsNumeric(msValue) Then
Let msValue = Replace(msValue, ",", ".")
End If
End Function
---


Gruß,
carpetemporem

Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
14.09.2010 00:06:01 carpetemporem
NotSolved
14.09.2010 18:48:00 Severus
NotSolved
Rot Aw:Membervariablen ByRef ändern?`
16.09.2010 00:20:07 carpetemporem
NotSolved